import os  # 用于访问操作系统环境变量
from langchain.tools import BaseTool  # LangChain的工具基类
from pydantic import BaseModel, Field, ConfigDict  # 数据验证和设置管理
from typing import Optional, Type, Any  # 类型注解
from email.mime.text import MIMEText
import smtplib
from dotenv import load_dotenv
import os


# 1 先定义一个数据模型
class EmailInput(BaseModel):
    to_email: str = Field(..., description="收件人的邮箱")
    subject: str = Field(..., description="邮件的标题")
    content: str = Field(..., description="邮件的内容")


# 2 配置类管理，表示模型字段的配置，表示智能体工具类
class EmailTool(BaseTool):
    # arbitrary_types_allowed=True：允许数据模型采用任意python的数据类型
    model_config = ConfigDict(arbitrary_types_allowed=True)

    # 3 定义初始化方法
    def __init__(self, **kwargs: Any):
        super().__init__(
            name="get_email_tool",
            description="用于发送邮件信息的，输入的参数应该是收件人的邮箱，邮件标题，邮件内容",
            **kwargs
        )

    # 4 定义智能体的工具
    args_schema: Type[BaseModel] = EmailInput

    # 5 定义执行方法
    def _run(self, to_email: str, subject: str, content: str):
        load_dotenv()
        # 创建邮件对象
        msg = MIMEText(content)
        # 收件人邮箱
        msg['To'] = to_email
        # 发件人邮箱
        msg["From"] = os.getenv("email_user")
        # 邮件主题
        msg["Subject"] = subject
        try:
            # 创建SMTP对象
            smtp = smtplib.SMTP_SSL(host=os.getenv("email_host"), port=465)
            # 登录邮箱
            smtp.login(os.getenv("email_user"), os.getenv("email_password"))
            # 发送邮件
            # os.getenv("email_user") 发件人，to_email 收件人，msg 邮件内容
            smtp.sendmail(os.getenv("email_user"), to_email, msg.as_string())

            return "邮件发送成功"
        except Exception as e:
            print(e)
            return "邮件发送失败"
